from django.http import HttpResponse, JsonResponse
from django.shortcuts import render


# 图片验证码
from libs.yuntongxun.yuntongxun.sms import CCP

""""
前段：
    拼接一个url， 然后给img，img会发起请求
    url=http：//ip:port//image_codes/uuid/
后端：
    请求：
        接收路由中的uuid
    业务逻辑：
        生成图片验证码和图片二进制，通过redis把图片验证码保存起来
    响应：
        返回图片二进制
    
    路由：
        GET  image_codes/uuid/
    步骤：
        # 1，接收路由中的uuid
        # 2. 生产图片验证码和图片二进制
        # 3. 通过redis把图片验证码保存起来
        # 4.返回图片二进制
"""

# Create your views here.
from django.views import View


class ImageCodeView(View):

    def get(self, request, uuid):
        # 1，接收路由中的uuid
        # 2. 生产图片验证码和图片二进制
        from libs.captcha.captcha.captcha import captcha
        # text 是图片验证码的内容，例如xyzz
        # image 是图片二进制
        text, image = captcha.generate_captcha()
        # 3. 通过redis把图片验证码保存起来
        # 3.1 进行redis 的链接
        from django_redis import get_redis_connection
        redis_cli = get_redis_connection('code')
        # 3.2 指令操作
        # name, time, value
        redis_cli.setex(uuid, 100, text)
        # 4.返回图片二进制
        # 因为图片是二进制，不能返回json需要返回http
        # content_type=响应体数据类型
        # content_type的语法形式是：大类/小类
        # 图片：image/jpeg, image/gif, image/png
        return HttpResponse(image, content_type="image/jpeg")


# 短信验证
"""
前端：
    当用户输入完手机号，图片验证码之后，发送一个axios请求
    sms_codes/18190012900/?image_code=DFQ6&image_code_id=188cbfe5-7cb9-40dd-b996-a21f28efe5be
    
后端：
    请求： 
        接收请求获取请求参数（路由有手机号，用户的图片验证码和uuid在查询字符串中）
    业务逻辑：
        验证参数，验证图片验证码，生成短信验证码，保存短信验证码，发送短信验证码
    响应：
        返回JSON{“code”:0, "errmsg":"ok"}
        
    路由：
        get
    步骤：
        # 1.接受请求，获取参数
        # 2.验证参数
        # 3.验证图片验证码，
        # 4.生成短信验证码，
        # 5.保存短信验证码，
        # 6.发送短信验证码
        # 7.返回响应
"""


class SmsCodeView(View):

    def get(self, request, mobile):
        # 1.接受请求，获取参数
        image_code = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')
        # 2.验证参数
        if not all([image_code, uuid]):
            return JsonResponse({'code': 400, 'errmsg': "参数不全"})

        # 3.验证图片验证码，
        # 3.1 链接redis
        from django_redis import get_redis_connection
        # 3.2 获取redis数据
        redis_cli = get_redis_connection('code')

        redis_image_code = redis_cli.get(uuid)
        if redis_image_code is None:
            return JsonResponse({'code': 400, 'errmsg': "图片验证码已过期"})
        # 3.3 对比
        if redis_image_code.decode().lower() != image_code.lower():
            return JsonResponse({'code': 400, 'errmsg': "图片验证码错误"})

        # 提取发送短信的标记
        send_flag = redis_cli.get('send_flag_%s' % mobile)

        if send_flag is not None:
            return JsonResponse({'code' : 400, "errmsg": "不要频繁发送短信"})

        # 4.生成短信验证码，
        from random import randint
        sms_code = '%06d' % randint(0, 999999)

        # 管道,减少redis服务器和客户端的TCP交流
        # ①新建一个管道
        pipeline = redis_cli.pipeline()
        # ②管道收集命令
        # 5.保存短信验证码，
        pipeline.setex(mobile, 300, sms_code)
        # 添加一个发送标记
        pipeline.setex('send_flag_%s' % mobile, 180, 1)
        # ③管道执行指令
        pipeline.execute()

        # 5.保存短信验证码，
        # redis_cli.setex(mobile, 300, sms_code)
        # 添加一个发送标记
        # redis_cli.setex('send_flag_%s' % mobile, 180, 1)

        # 6.发送短信验证码
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)
        # celery发送
        from celery_tasks.sms.tasks import celery_send_sms_code
        # delay 的参数 等同于任务（函数）的参数
        celery_send_sms_code.delay(mobile, sms_code)

        # 7.返回响应
        return JsonResponse({'code': 0, 'errmsg': "ok"})


# Celery
"""
生产者
消费者
队列（中间人，经纪人）
Celery -- 将这三者实现了
"""